package main

import (
	"fmt"
	"reflect"
)

func I1() {
	var slice1 = make([]int, 3, 6)
	for key, item := range slice1 {
		fmt.Println(key, item)
	}
	// make时，切片默认只有 0 1 2 三个元素， 当拿第三个元素的时候，切片中没有所以报错
	fmt.Println(slice1[3])
}

// 切片的切片
func I2() {
	// 他们指向的是同一块内存地址
	// 但切片的切片指向的元素位置不一样， 所以打印出来的内存地址不同
	var slice1 = []int{1, 2, 3, 4, 5}

	v1 := slice1[1:3]
	v2 := slice1[:3]
	v3 := slice1[2:]

	fmt.Printf("mem:%p, val:%d\n", slice1, slice1)
	fmt.Printf("mem:%p, val:%d\n", &v1, v1)
	fmt.Printf("mem:%p, val:%d\n", &v2, v2)
	fmt.Printf("mem:%p, val:%d\n", &v3, v3)
}

// 切片追加
func I3() {
	var slice1 = []int{1, 7}
	var slice2 = []int{4, 2}

	//简单追加
	v1 := append(slice1, 99)

	//多元素追加
	v2 := append(slice1, 100, 101)

	//追加一个切片
	v3 := append(slice1, slice2...)

	fmt.Println(v1, v2, v3)
}

// 切片的删除， 默认切片是不能删除的，所以需要自己设计
func I4() {
	// 这样做会破坏原切片
	//
	var slice1 = []int{1, 2, 3, 4, 5, 6, 7}
	deleteNum := 2
	result := append(slice1[:deleteNum], slice1[deleteNum+1:]...)
	fmt.Println(result, slice1)

}

// 切片的插入

func I5() {
	// 在切片中间加入一个 99
	var slice1 = []int{11, 22, 33, 44}
	var insertData int = 2

	// 声明一个切片， 使长度为0（无默认值）， 容量为slice1切片+1
	var result = make([]int, 0, len(slice1)+1)

	result = append(result, slice1[:insertData]...)
	result = append(result, 99)
	result = append(result, slice1[insertData:]...)

	fmt.Println(slice1, reflect.TypeOf(slice1), len(slice1))
	fmt.Println(result, reflect.TypeOf(result), len(result))
}
